package ULHT.LIG2N1.RC.SERVER;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class GameThread implements Runnable {

    private MulticastSocket multicastSocket;
    private GameVariables gameVariables;
    private InetAddress group;
    private int port;
    private DateTimeFormatter fmt = DateTimeFormat.mediumTime();//forStyle("HH:mm:ss");
    private boolean isPlayable = true;
    private boolean msgSent = false;

    // para as estatisticas do jogo
    //private ArrayList;
    public GameThread(MulticastSocket multicastSocket, InetAddress group, int port, GameVariables gameVariables) {
        this.multicastSocket = multicastSocket;
        this.gameVariables = gameVariables;
        this.group = group;
        this.port = port;
        this.gameVariables.setCurrentLevel(1);

        DateTime data = new DateTime(gameVariables.getHoraInicioServidor().getYear(),
                gameVariables.getHoraInicioServidor().getMonthOfYear(),
                gameVariables.getHoraInicioServidor().getDayOfMonth(),
                gameVariables.getHoraInicioServidor().getHourOfDay(),
                gameVariables.getHoraInicioServidor().getMinuteOfHour());

        //this.gameVariables.setHoraInicioProximoJogo(data.plusMinutes(2 - (data.getMinuteOfHour() % 2)));
        this.gameVariables.setHoraInicioProximoJogo(DateTime.now().plusSeconds(30));
    }

    @Override
    public void run() {
        while (isPlayable) {
            // bloqueia a hipotese de resposta
            /*
             * if (gameVariables.getTimeOutPerguntaActual().isBeforeNow()) { if
             * (gameVariables.isPlayable()) { // envia mensagem de fim de jogo
             * aos clientes String response = "\n\nUDP_MSG (" +
             * DateTime.now().toString(fmt.withLocale(Locale.FRANCE)) + ") A
             * sessão de questionário terminou, próxima sessão às " +
             * gameVariables.getStringHoraInicioProximoJogo() + "\n ";
             * writeToClients(response); gameVariables.setPlayable(false);
             * //TODO calcular o vencedor da ronda anterior, // calcular a
             * pergunta, e caso seja um novo nivel // eliminar os que não têm
             * respostas certas no nivel anterior, // escrever listas e etc... }
            }
             */
            if (gameVariables.getHoraInicioProximoJogo().isBeforeNow() && !msgSent) {

                // envia mensagem de inicio de jogo aos clientes
                String response = "\n\nUDP_MSG (" + DateTime.now().toString(fmt.withLocale(Locale.FRANCE)) + ") A sessão de questionário iniciou, pode responder\n   ";
                writeToClients(response);
                gameVariables.setPlayable(true);
                this.msgSent = true;
            }
        }
    }

    private void writeToClients(String message) {

        DatagramPacket outPacket = new DatagramPacket(message.getBytes(), message.length(), group, port);
        try {
            this.multicastSocket.send(outPacket);
            System.out.println("MULTICAST ENVIADO");
        } catch (IOException ex) {
            Logger.getLogger(GameThread.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
